/*global pi, Date, Worker, ArrayBuffer, Int32Array, Float32Array, setTimeout, clearTimeout */

/**
 * 与javascript语言相关的封装
 */
pi.mod.define('pi.lang', function(pi) {
	"use strict";

	/* 模块变量 */
	var module = {};

	/**
	 * 创建数组
	 * length：int, 大于等于0，数组元素的个数
	 * 返回：Array, 创建好的数组
	 */
	module.createArray = function(length) {
		var arr;
		if (length >= 0) {
			arr = [];
			arr.length = length;
		}
		return arr;
	};

	/**
	 * 创建Worker，封装js的new Worker函数
	 */
	module.createWorker = function(mod) {
		var w = new Worker(pi.config.libPath + "thread.js");
		if (w !== undefined) {
			w.postMessage({
				modPath: pi.config.libPath + "mod.js",
				modConfig: pi.mod.list(),
				runMod: mod
			});
		}
		return w;
	};

	/**
	 * 创建Date
	 * 返回：Date
	 */
	module.createDate = function() {
		return new Date();
	};

	/**
	 * 解析不安全的数字
	 */
	module.parseIntUnsafe = function(str) {
		return parseInt(str);
	};

	/**
	 * 解析数字
	 */
	module.parseInt = function(str, bit) {
		return parseInt(str, bit || 10);
	};

	/**
	 * 创建ArrayBuffer
	 * size: int，大于等于0，ArrayBuffer的字节数
	 * 返回：ArrayBuffer
	 */
	module.createArrayBuffer = function(size) {
		return new ArrayBuffer(size);
	};

	/**
	 * 创建Float32Array
	 * 利用ArrayBuffer
	 * len：数组个数
	 */
	module.createF32Array = function(len) {
		var r, arr;
		len = len || 0;
		arr = new ArrayBuffer(4 * len);
		r = new Float32Array(arr);
		return r;
	};

	/**
	 * 利用ArrayBuffer创建Int32Array
	 * len：数组个数
	 */
	module.createI32Array = function(len) {
		var r, arr;
		len = len || 0;
		arr = new ArrayBuffer(4 * len);
		r = new Int32Array(arr);
		return r;
	};

	/**
	 * 利用ArrayBuffer创建len个字节的数组
	 */
	module.createU8Array = function (len) {
		var r, arr;
		len = len || 0;
		arr = new ArrayBuffer(len);
		r = new Uint8Array(arr);
		return r;
	};

	/**
	 * 判断value是否为Array
	 * 来自《javascript语言精粹》数组 那一章
	 */
	module.isArray = function(value) {
		return Object.prototype.toString.apply(value) === "[object Array]";
	};

	/**
	 * 判断value是否为非null的Object
	 */
	module.isObject = function(value) {
		return value !== null && typeof value === typeof {};
	};

	/**
	 * 判断value是否为字符串
	 */
	module.isString = function(value) {
		return typeof value === typeof "";
	};

	/**
	 * 判断value是否为数字
	 */
	module.isNumber = function(value) {
		return typeof value === typeof 0;
	};

	/**
	 * 判断value是否为布尔型
	 */
	module.isBool = function(value) {
		return typeof value === typeof true;
	};

	/**
	 * 判断value是否为function
	 */
	module.isFunction = function(value) {
		return typeof value === "function";
	};
	// 设置永久的定时回调
	module.setInterval = function(callback, ms) {
		var fun = function() {
			if (callback() !== false) {
				setTimeout(fun, ms);
			}
		};
		setTimeout(fun, ms);
	};

	// 设置单次的定时回调
	module.setTimeout = function(callback, ms) {
		return setTimeout(callback, ms);
	};
	// 取消设置单次的定时回调
	module.clearTimeout = function(ref) {
		return clearTimeout(ref);
	};
	// 取出对象上所有的键
	module.keys = function(obj) {
		var i, arr = [];
		for (i in obj) {
			if (obj.hasOwnProperty(i)) {
				arr.push(i);
			}
		}
		return arr;
	};
	// 取出对象上所有的值
	module.values = function(obj) {
		var i, arr = [];
		for (i in obj) {
			if (obj.hasOwnProperty(i)) {
				arr.push(obj[i]);
			}
		}
		return arr;
	};
	// 取出对象上所有的键值，数组的元素为长度等于2的数组，0为键，1为值
	module.keyValues = function(obj) {
		var i, arr = [];
		for (i in obj) {
			if (obj.hasOwnProperty(i)) {
				arr.push([i, obj[i]]);
			}
		}
		return arr;
	};
	// 将源对象上所有的键值都绑定到目标对象上，主要用于委托方法和常量
	module.bind = function(dest, src) {
		var i, n = 0;
		for (i in src) {
			if (src.hasOwnProperty(i) && dest[i] === undefined) {
				dest[i] = src[i];
				n += 1;
			}
		}
		return n;
	};
	// 将源对象上所有的键值都解绑定到目标对象上
	module.unbind = function(dest, src) {
		var i, n = 0;
		for (i in src) {
			if (src.hasOwnProperty(i) && dest[i] === src[i]) {
				delete dest[i];
				n += 1;
			}
		}
		return n;
	};

	return module;
});